package com.br.negocio.web.backbean;

import java.io.Serializable;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import com.br.negocio.controller.ControllerCliente;
import com.br.negocio.vo.ClienteVO;
import com.br.negocio.vo.home.TipoClienteHome;
import com.br.negocio.web.formbean.ClienteFormBean;

@Controller("clienteBackBean")
@Scope("session")
public class ClienteBackBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Resource
	private ControllerCliente controllerCliente;
	
	private ClienteFormBean clienteFormBean;

	public ClienteBackBean() {
		super();
		this.clienteFormBean = new ClienteFormBean();
	}

	public ClienteFormBean getClienteFormBean() {
		return this.clienteFormBean;
	}

	public void setClienteFormBean(ClienteFormBean clienteFormBean) {
		this.clienteFormBean = clienteFormBean;
	}
	
	// M�TODOS

	public void obterListaCliente() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			this.clienteFormBean.setListaCliente(this.controllerCliente.obterListaCliente());
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao obter a lista de clientes: " + e.getMessage()));
		}
	}
	
	public void manterCliente() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.clienteFormBean.getClienteManter().getCodigo() == 0) {
				this.controllerCliente.inserirCliente(this.clienteFormBean.getClienteManter());
			} else {
				this.controllerCliente.atualizarCliente(this.clienteFormBean.getClienteManter());
			}
			this.clienteFormBean.setListaCliente(this.controllerCliente.obterListaCliente());
		} catch (Exception e) {
			context.addMessage(null , new FacesMessage("Erro ao manter o cliente: " + e.getMessage()));
		}
		
	}
	
	public void excluirCliente() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.getClienteFormBean().getClienteManter().getCodigo() != 0) {
				this.controllerCliente.removerCliente(this.clienteFormBean.getClienteManter());
				this.clienteFormBean.setListaCliente(this.controllerCliente.obterListaCliente());
				this.clienteFormBean.setClienteManter(new ClienteVO());
			}
		} catch (DataIntegrityViolationException e) {
			if (e.getCause().getClass() == ConstraintViolationException.class) {
				context.addMessage(null, new FacesMessage("Erro ao excluir o cliente: O cliente est� associado a alguma outra entidade."));
			} else {
				context.addMessage(null, new FacesMessage("Erro ao excluir o cliente: " + e.getMessage()));
			}
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao excluir o cliente: " + e.getMessage()));
		}
	}
	
	// LISTENERS
	
	public void listenerIrInserirCliente(ActionEvent evento) {
		this.clienteFormBean.setClienteManter(new ClienteVO());
		this.clienteFormBean.getClienteManter().setTipoCliente(TipoClienteHome.FISICO);
		this.clienteFormBean.setIsDisabled(false);
		this.clienteFormBean.setIsEditarDisabled(false);
		this.clienteFormBean.setHead("Cadastrar Cliente");
	}
	
	public void listenerIrExcluirCliente(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("clienteExcluir");
		ClienteVO clienteVO = ((ClienteVO)comp.getValue());
		
		if (clienteVO != null) {
			this.clienteFormBean.setClienteManter(this.controllerCliente.obterCliente(clienteVO));
		}
		this.clienteFormBean.setHead("Excluir Cliente");
		this.clienteFormBean.setIsDisabled(true);
		this.clienteFormBean.setIsEditarDisabled(true);
	}
	
	public void listenerIrEditarCliente(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("clienteEditar");
		ClienteVO clienteVO = ((ClienteVO)comp.getValue());
		
		if (clienteVO != null) {
			this.clienteFormBean.setClienteManter(this.controllerCliente.obterCliente(clienteVO));
		}
		this.clienteFormBean.setHead("Editar Cliente");
		this.clienteFormBean.setIsDisabled(false);
		this.clienteFormBean.setIsEditarDisabled(true);
	}

}